﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Platform.Infrastructure;

namespace Platform.ObjectModel.Design
{
	/// <summary>
	/// Representa uma regra de validação de uma valor do sistema
	/// </summary>
	/// <remarks>
	/// Uma regra pode ser montada com código que será executado por um código externo da aplicação
	/// O nome irá identificar globalmente uma regra
	/// </remarks>
	public abstract class RuleBase : DocumentFlake //: DataObjectFlake, IQualifiedDataObject //: DocumentFlake, IQualifiedDataObject //: DataObjectFlake, IQualifiedDataObject
	{
		// TODO : O objeto RuleBase para ser alterado para retornar uma expressão lambda, que será compilada quando for utilizado pela primeira vez

		/// <summary>
		/// 
		/// </summary>
		/// <param name="name"></param>
		protected RuleBase( DataObjectName name )
			: base( name )
		{
			//Arguments.IsNotNull( "name", name );
			//this.QualifiedName = name;
		}

		/// <summary>
		/// Obtém ou define a mensagem de erro que será apresentada quando a validação falhar
		/// </summary>
		public string ErrorMessageFormat
		{ get; set; }

		/// <summary>
		/// Obtém ou define a mensagem de exemplo ou ajuda que será apresentada para o usuário
		/// </summary>
		public string TooltipText
		{ get; set; }

		/// <summary>
		/// Indica se a regra está habilitada
		/// </summary>
		public bool Enabled
		{ get; set; }

		//public object this[ DataObjectName fieldName ]
		//{
		//	get { return base[ this.QualifiedName.FieldName( fieldName ) ]; }
		//	set { base[ this.QualifiedName.FieldName( fieldName ) ] = value; }
		//}

		#region IQualifiedDataObject Members

		/// <summary>
		/// 
		/// </summary>
		public DataObjectName QualifiedName
		{
			get;
			private set;
		}

		#endregion

		/// <summary>
		/// Realiza a execução da regra, e validação do valor <paramref name="value"/>.
		/// </summary>
		/// <param name="value"></param>
		/// <param name="context"></param>
		/// <returns></returns>
		public abstract bool Validate( dynamic value, DocumentContext context );

		
	}
}
